﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;
using WpfApplication2.UserControls;
using WpfApplication2.Helpers;
using WpfApplication2.SindicatoWebService;
using System.Windows.Input;
using WpfApplication2.Views.Afiliado;
using WpfApplication2.Views.Usuario;

namespace WpfApplication2.ViewModels.Usuario
{
    public class EditarUsuarioViewModel : ViewModel
    {
        #region properties

        public SindicatoWebService.Service1SoapClient WS;
        public Instancias Instancias { get; set; }

        public PropertyElement Apellido
        {
            get
            {
                return apellido;
            }
            set
            {
                if (apellido != value)
                {
                    apellido = value;
                    RaisePropertyChanged("Apellido");
                }
            }
        }
        private PropertyElement apellido;

        public PropertyElement Nombre
        {
            get
            {
                return nombre;
            }
            set
            {
                if (nombre != value)
                {
                    nombre = value;
                    RaisePropertyChanged("Nombre");
                }
            }
        }
        private PropertyElement nombre;

        public PropertyElement Rol
        {
            get
            {
                return rol;
            }
            set
            {
                if (rol != value)
                {
                    rol = value;
                    RaisePropertyChanged("Rol");
                }
            }
        }
        private PropertyElement rol;

        public PropertyElement UserName
        {
            get
            {
                return userName;
            }
            set
            {
                if (userName != value)
                {
                    userName = value;
                    RaisePropertyChanged("UserName");
                }
            }
        }
        private PropertyElement userName;

        public RolDTO[] RolesCollection
        {
            get
            {
                return rolesCollection;
            }
            set
            {
                if (rolesCollection != value)
                {
                    rolesCollection = value;
                    RaisePropertyChanged("RolesCollection");
                }
            }
        }
        private RolDTO[] rolesCollection;

        public UsuarioDTO Usuario { get; set; }

        #endregion


        public EditarUsuarioViewModel(Instancias instancias, UsuarioDTO usuario)
        {
            WS = new SindicatoWebService.Service1SoapClient();
            Instancias = instancias;
            Usuario = usuario;
            InicializarPropiedades();
            RolesCollection = WS.GetRoles();
        }

        private void InicializarPropiedades()
        {
            //Inicializacion de propiedades:
            Apellido = new PropertyElement() { Foreground = "White", Name = "Apellido", Value = Usuario.Apellido };
            Nombre = new PropertyElement() { Foreground = "White", Name = "Nombre", Value = Usuario.Nombre };
            UserName = new PropertyElement() { Foreground = "White", Name = "UserName", Value = Usuario.UserName };
            Rol = new PropertyElement() { Foreground = "White", Name = "Rol", Value = Usuario.Rol.ToString() };
            
            ValidationList = new List<PropertyElement>();

            Apellido.Validations.Add(ValidationType.Requerido);
            Nombre.Validations.Add(ValidationType.Requerido);
            UserName.Validations.Add(ValidationType.Requerido);
            Rol.Validations.Add(ValidationType.Requerido);

            ValidationList.Add(Apellido);
            ValidationList.Add(Nombre);
            ValidationList.Add(UserName);
            ValidationList.Add(Rol);
        }

        #region Command

        private DelegateCommand updateUsuario;

        public ICommand UpdateUsuario
        {
            get
            {
                if (updateUsuario == null)
                {
                    updateUsuario = new DelegateCommand(Update, CanExecute);
                }
                return updateUsuario;
            }
        }

        private bool CanExecute()
        {
            return true;
        }

        private void Update()
        {
            if (DataIsValid)
            {
                WS.ModificarUsuario(
                    new UsuarioDTO()
                    {
                        Id = Usuario.Id,
                        Apellido = FormatHelper.AllWordsToUpper(Apellido.Value),
                        Nombre = FormatHelper.AllWordsToUpper(Nombre.Value),
                        Rol = Convert.ToInt32(Rol.Value),
                        UserName = FormatHelper.AllWordsToUpper(UserName.Value)
                    });
                Instancias.ModalDialog.ShowHandlerDialog("El Usuario se ha modificado correctamente.");
                var user = WS.ObtenerUsuarioPorId(Usuario.Id);
                Instancias.FrameContent.Content = new ConsultarUsuario(Instancias, user);
            }
            else
            {
                var res = Instancias.ModalDialog.ShowHandlerDialog("Los datos del usuario son inválidos. Por favor complete correctamente los campos sobresaltados");
            }
        }

        #endregion
    }
}
